// 净化器，防 XSS 攻击
import sanitizeHtml from 'sanitize-html';

// 净化器配置
const sanitizeConfig = {
	// 允许的 HTML 标签列表
	allowedTags: ['p', 'b', 'i', 'em', 'strong', 'a', 'img'],
	// 允许的 HTML 属性及其对应的标签
	allowedAttributes: {
		a: ['href', 'title'],
		img: ['src', 'alt']
	},
	// 对特定标签进行转换的函数,可以修改特定标签的属性值或结构
	transformTags: {
		a: (tagName, attribs) => {
			if (!attribs.href.startsWith('http')) {
				attribs.href = 'https://example.com';
			}
			return { tagName, attribs };
		}
	},
	// 允许的 CSS 样式及其对应的属性,只有这些样式属性及其值会被保留
	allowedStyles: { 
		// * 代表所有标签
		'*': { 
	        color: [/^#[0-9a-f]{6}$/i, /^rgb\(\d{1,3},\s*\d{1,3},\s*\d{1,3}\)$/]
	        'font-size': [/\d+px/]
	    },
		// 仅适用于 <p> 标签
	    p: { 
	        'font-weight': ['bold', 'normal']
	        }
	},
	// 处理allowedTags列表中不允许的标签，方式，'escape' 这个属性将不允许的标签及其内容转义为文本形式，'remove' 这个属性会直接移除这些标签
	disallowedTagsMode: 'escape', 
	// 是否解析 style 行内属性,设置为 true 时，style 属性将被解析并清理，并根据 allowedStyles 配置来决定哪些样式属性及其值是允许的
	parseStyle: true,
	// 是否允许协议相对 URL（如 //example.com）,设置为 false 时，协议相对 URL 将被移除或替换
	allowProtocolRelativeUrls: false,
	//是否强制编码 HTML 实体,设置为 true 时，特殊字符将被编码为 HTML 实体，例如 < 被编码为 &lt;
	enforceHtmlEntityEncoding: true,
	// 允许的 URL 方案（协议）,只有这些方案的 URL 会被保留，其他方案的 URL 将被移除
	allowedSchemes: ['http', 'https', 'mailto'],
	// 为不同标签指定不同的允许 URL 方案
	allowedSchemesByTag: { 
	    a: ['http', 'https', 'mailto'],
	    img: ['http', 'https']
	},
	// 指定哪些属性需要检查 URL 方案。
	allowedSchemesAppliedToAttributes: ['href', 'src'],
	// 这些标签将被视为自闭合标签
	selfClosing: ['img', 'br', 'hr'], 
	// 排除某些标签或属性的过滤器函数,返回 true 的标签或属性将被移除
	exclusiveFilter: (frame) => frame.tag === 'script' || frame.tag === 'style', 
	// 这些标签的内容将被视为非文本内容，不会被清理
	nonTextTags: ['script', 'style'], 
	// 文本内容的过滤器函数，可以对文本内容进行自定义处理
	textFilter: (text) => text.replace(/badword/g, '****')
}

export function sanitize(input) {
	return sanitizeHtml(input, sanitizeConfig);
}